const url = require('url')
const path = require('path')
const fs = require('fs')

// 扩展res
function changeRes(res) {
  res.send = data => {
    res.writeHead(200, {'Content-Type': 'text/html;charset=urf-8'});
    res.end(data)
  }
}
// 根据后缀名获取文件类型
let getFileMime = function(extname) {
  var data = fs.readFileSync('./data/mime.json'); // 相对于文件夹
  let mimeObj = JSON.parse(data.toString())
  return mimeObj[extname]
}
// 静态web服务方法
function initStatic(req, res, staticPath) {
  // 1. 获取地址
  let pathname = url.parse(req.url).pathname; // 去掉 search后缀

  pathname = pathname === '/' ? '/index.html':pathname
  // 可以获取后缀名 path.extname()
  let extname = path.extname(pathname)
  // 2. 通过fs模块读取文件
  if(pathname !== '/favicon.ico') {
    try {
      let data = fs.readFileSync('./' + staticPath + pathname)
      if(data) {
        let mime = getFileMime(extname)
        res.writeHead(200, {'Content-Type': mime +';charset=utf-8'})
        res.end(data)
      }
    } catch (error) {
      // console.log(error)
    }
  }
}

let server = () => {
  let G = {
    _get: {},
    _post: {},
    staticPath: 'static' // 默认静态web目录
  }
  // 把get和post分开
  // || G2 = {}

  let app = function (req, res) {
    console.log('调用app 方法') 
    // 扩展res的方法
    changeRes(res)

    // 配置静态web服务
    initStatic(req, res, G.staticPath)

    let pathname = url.parse(req.url).pathname
    // 获取请求类型
    let method = req.method.toLowerCase() 
    if(method === 'get' && G._get[pathname]) {
      G._get[pathname](req, res) // 执行方法
    } else if(method === 'post' && G._post[pathname]) {
      // post 获取post的数据，把它绑定到req.body
      let postData = ''
      req.on('data', (data) => {
        postData += data
      })
      req.on('end', () => {
        req.body = postData
        G._post[pathname](req, res)
      })

    }
    //  else {
    //   res.writeHead(404, {
    //     'Content-Type': 'text/html;charset=urf-8'
    //   })
    //   res.end('404')
    // }

  }
  // get请求
  app.get = function (str, cb) {
    // 注册方法
    G._get[str] = cb
  }
  // post请求
  app.post = function (str, cb) {
    // 注册方法
    G._post[str] = cb
  }
  // 配置静态web服务目录
  app.static = function(staticPath) {
    G.staticPath = staticPath
  }
  return app
}

module.exports = server()